/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package memoriavirtual;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Pedro Freitas
 */
public class MemoriaPrincipal {

    private int tamanho;
    private int tamanhoQuadro;
    private int qtdQuadros;
    private int qtdQuadrosDisponiveis;
    private HashMap<String, TP> processos_TP;
    private Quadro quadros[];

    public MemoriaPrincipal() {
    }

    public MemoriaPrincipal(int tamanho, int tamanhoQuadro) {
        this.tamanho = tamanho;
        this.tamanhoQuadro = tamanhoQuadro;
        this.qtdQuadros = tamanho / tamanhoQuadro;
        this.qtdQuadrosDisponiveis = qtdQuadros;
        this.processos_TP = new HashMap(Main.A_controller.getProcessos().size());
        this.quadros = new Quadro[qtdQuadros];
        for (int i = 0; i < quadros.length; i++) {
            quadros[i] = new Quadro(new Pagina(-1, "", -1, -1, -1, false));
        }
    }

    public int getTamanhoQuadro() {
        return tamanhoQuadro;
    }

    public boolean isCheia() {
        return this.qtdQuadrosDisponiveis == 0;
    }

    public void decrementaQtdQuadrosDisponiveis() {
        this.qtdQuadrosDisponiveis--;
    }

    public HashMap getProcessos_TP() {
        return processos_TP;
    }

    public TP criarTP(Processo processo, int tamEndLogico, MemoriaSecundaria ms) {
        int qtd_pag = processo.getTamanhoImg() / tamanhoQuadro;
        if (processo.getTamanhoImg() % tamanhoQuadro != 0) {
            qtd_pag++;
        }
        TP tp = null;
        if ((this.qtdQuadrosDisponiveis - qtd_pag) >= 0) {
            processos_TP.put(processo.getNome(), new TP(qtd_pag, tamEndLogico));
            tp = processos_TP.get(processo.getNome());
            this.qtdQuadrosDisponiveis -= qtd_pag;
            for (int i = 0; i < qtd_pag; i++) {
                tp.getCelulas()[i].setCelulaTP(i, false, false, ms.buscaMS(processo.getNome()));
            }
            JOptionPane.showMessageDialog(null, "A TP do processo " + processo.getNome() + " foi criada com sucesso !");
        } else {
            JOptionPane.showMessageDialog(null, "Memoria cheia!");
        }
        return tp;
    }

    public void setProcessos_TP(ArrayList<Processo> processos, int tamEndLogico, String politica) {
        processos_TP = new HashMap(processos.size());
        int qtd_pag;
        Processo aux;
        Iterator itr = processos.iterator();
        int aux2 = this.qtdQuadrosDisponiveis;
        while (itr.hasNext() && aux2 != 0) {
            aux = (Processo) itr.next();
            qtd_pag = aux.getTamanhoImg() / tamanhoQuadro;
            if (aux.getTamanhoImg() % tamanhoQuadro != 0) {
                qtd_pag++;
            }
            processos_TP.put(aux.getNome(), new TP(qtd_pag, tamEndLogico));
            aux2 = aux2 - qtd_pag;
        }
        if (aux2 == 0) {
            JOptionPane.showMessageDialog(null, "Memoria cheia!");
        }
        this.qtdQuadrosDisponiveis = aux2;
    }

    public int getQtdQuadros() {
        return qtdQuadros;
    }

    public Quadro getQuadro(int i) {
        return quadros[i];
    }

    public void setQuadro(Quadro quadro, int i) {
        quadros[i] = quadro;
    }

    public Quadro[] getQuadros() {
        return quadros;
    }

    public void setQuadros(Quadro[] quadros) {
        this.quadros = quadros;
    }

    public DefaultTableModel getMP() {
        DefaultTableModel resp = new DefaultTableModel();
        Object[] identificadores = {"Número do Quadro", "Endereço Inicial", "Endereço Final", "Momento de Carga", "Momento Referencia", " Nome do processo", "Número da pagina"};
        resp.setColumnIdentifiers(identificadores);
        Object[] aux = new Object[7];
        for (int i = 0; i < qtdQuadros; i++) {
            aux[0] = i;
            aux[1] = i * tamanhoQuadro;
            aux[2] = (i * tamanhoQuadro + tamanhoQuadro) - 1;
            aux[3] = quadros[i].getPagina().getMomentoCarga();
            aux[4] = quadros[i].getPagina().getMomentoReferencia();
            aux[5] = quadros[i].getPagina().getNomeProc();
            aux[6] = quadros[i].getPagina().getNumero();
            resp.addRow(aux);
        }
        return resp;
    }
}
